#include "terminal.h"

/**
 * Terminal permet d'envoyer un ordre conçu aléatoirement à partir des annuaires (commerçants,actions)
 * et de valeurs aléatoires.
 * Il reçoit et affiche à l'écran un accusé de réception provenant du serveur d'acquisition
 *
 * Il prend 2 descripteurs de fichiers en paramètres vers lesquels il redirige son entrée et sa sortie standarts.
 */

void launch_terminal(module* mdl, const int port) {
	server srv = *(mdl->srv);
	strcpy(srv.name, mdl->name);
	struct hostent *he;
	if ((he=gethostbyname("localhost")) == NULL) {
		herror("gethostbyname");
		log_srv(&srv, "erreur hôte introuvable");
		exit(1);
	}

	srv.remote_addr.sin_family = AF_INET; /* host byte order */
	srv.remote_addr.sin_port = htons(port); /* short, network byte order */
	srv.remote_addr.sin_addr = *((struct in_addr *)(he)->h_addr);
	bzero(&(srv.remote_addr.sin_zero), 8); /* zero pour le reste de struct */

	log_srv(&srv,"créé.");
	if(!fork()) { // on fork le terminal
		while(1) {
			if ((srv.sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
				perror("Terminal: erreur lors de l'init du socket");
				log_srv(&srv, "erreur lors de l'init du socket");
			}
			if (connect(srv.sockfd,( struct sockaddr *)&(srv.remote_addr), sizeof(struct sockaddr)) == -1) {
				perror("Terminal: impossible de se connecter");
				log_srv(&srv,"impossible de se connecter");
				exit(-1);
			}

			msg * damsg;
			damsg=gene_msg();
			log_msg_srv(&srv,damsg,"Envoi de");
			int lSent=0; char* damsg_str;
			damsg_str = msg_to_str(damsg);

			if ((lSent=send(srv.sockfd, damsg_str, strlen(damsg_str)+1, 0)) == -1) {
				perror("Terminal: erreur lors de l'envoi du message");
				log_srv(&srv, "erreur lors de l'envoi du message");
				exit(1);
			}
#ifdef DEBUG
			char tmp[1024]; sprintf(tmp,"%d octets envoyés",lSent);
			log_msg_srv(&srv,damsg,tmp);
#endif
			char recvdata[MAXRECVDATA];
			if ((srv.numbytes=recv(srv.sockfd, recvdata, MAXRECVDATA, 0)) == -1) {
				perror("recv");
				log_srv(&srv,"erreur lors du recv!");
				exit(1);
			}
			log_msg_srv(&srv,str_to_msg(recvdata),"Réception");
			sleep(2);
			free(damsg);
			close(srv.sockfd);
		}
	}
}

msg* gene_msg() {
	//on ouvre les fichiers commercants et actions contenant les listes de commercants
	//et d'actions dispos
	FILE* actions = fopen("./data/actions", "r");
	;
	FILE* commercants = fopen("./data/commercants", "r"); // Ouverture du fichier en lecture
	if (commercants== NULL) {
		printf("\nLe fichier de commerçant ne peut être ouvert\n");
		exit(1); // échec
	} else if (actions == NULL) {
		printf("\nLe fichier de actions ne peut être ouvert\n");
		exit(1); // échec
	}
	msg * ordre =( msg*) malloc(sizeof(msg)); 
	char id_commercant[100];
	char id_action[100];
	char type_transaction[100];
	char valeur[100];
	//lecture de l'id_commercant du commercant
	if (commercants!=NULL && actions!=NULL) {
		int nombre_commercants=0;
		//char id_commercant[11];
		fseek(commercants,0,SEEK_SET);
		//récupération du nombre de lignes = nombre de commercants dans le fichier
		while(fgets(id_commercant,25,commercants)!=0) {
			nombre_commercants++;
		}

		//on tire un commercant aléatoirement dans le fichier de commercants
		fseek(commercants,0,SEEK_SET);
		aleainit();
		int i;
		int commercant_aleatoire = alea(1,nombre_commercants);
		for(i=0;i<commercant_aleatoire;i++) {
			fgets(id_commercant,25,commercants);
		}
		//on récupère uniquement l'identifiant du commercant
		char* pch;
		pch = strtok (id_commercant," ");
		while (pch != NULL)
		{
			pch = strtok (NULL, " ");
			if(pch!=NULL)
				strcpy(id_commercant,pch);
		}
		//on remplace le \n qui est a la fin de la chaine
		id_commercant[10] = '\0';

		fclose(commercants);

		//lecture de l'id_action de l'action
		int nombre_actions=0;

		fseek(actions,0,SEEK_SET);
		//récupération du nombre de lignes = nombre d'actions dans le fichier
		while(fgets(id_action,25,actions)!=0) {
			nombre_actions++;
		}
		//on tire une action aléatoirement dans le fichier des actions
		fseek(actions,0,SEEK_SET);
		aleainit();
		int action_aleatoire = alea(1,nombre_actions);
		for(i=0;i<action_aleatoire;i++) {
			fgets(id_action,25,actions);
		}
		char temp[100];
		strcpy(temp,id_action);
		strcpy(id_action,"");
		for(i=0;i<10;i++) {
			strncat(id_action,temp+i,1);
		}

		fclose(actions);

		//type_transaction défini aléatoirement
		aleainit();
		int type_aleatoire = alea(1,2);
		for(i=0;i<type_aleatoire;i++) {
			switch(i) {
			case(0):strcpy(type_transaction,"Achat");break;
			case(1):strcpy(type_transaction,"Vente");break;
			}
		}

		//valeur de la transaction définie aléatoirement
		aleainit();
		sprintf(valeur,"%d",alea(1,50));

		ordre = create_msg(id_commercant, type_transaction, id_action, valeur);
	}
	return ordre;
}
